开源 | CurveFS预览版重磅首发,Curve加速迈向云原生软件定义存储
提供基于FUSE的用户态的文件读写接口,并且兼容POSIX协议
支持数据存储到对象存储系统
支持云原生部署、运维、使用
支持多文件系统
为什么要做CurveFS
支持多领域数字业务发展,将Curve开源的网易数帆存储团队,在实践中先一步感受到了新一代分布式文件系统的需求,并得到了Curve社区成员的共鸣。
从跟网易内部产品以及数帆商业化客户沟通,用户使用的分布式文件系统主要是CephFS(配合Kubernetes做PV使用),在近几年的使用过程中,用户在如下几个场景遇到了难以彻底解决的问题:
场景1:期望兼顾性能和容量的机器学习场景
某业务机器学习场景下,在使用CephFS过程中,训练耗时期望尽量短,训练结果期望长期保存,但访问频次很低,因此希望可以主动/被动沉淀到容量型存储池,需要用到的时候可以主动/被动触发迁移到性能型存储池。这里的主动是指业务可以自行切换某个目录的存储类型(如容量型、性能型),被动是指通过配置一定的生命周期规则(或缓存管理策略)来触发存储池切换。
部分场景下性能瓶颈严重:尤其是元数据时延方面,即使启用了多MDS+静态目录绑定、元数据存储池使用SSD盘、甚至使用内核态客户端等前提下,仍然不能很好的满足业务诉求
可用性风险高:多MDS场景+静态目录绑定功能开启后,一旦某个主MDS故障,切换时间会比较长,期间业务会中断
元数据负载均衡问题:静态目录绑定勉强可用,但可运维性不足,实施困难;动态目录迁移目前可用性较差,会造成频繁的反复迁移,影响元数据访问的稳定性
元数据锁实现逻辑复杂、难以理解、学习门槛过高:功能全面,但性能难免会受影响,另外开发人员维护难度大增,二次开发困难,遇到问题分析起来也很吃力
均衡性问题:Ceph通过crush算法来放置对象,该算法可能导致集群均衡性不是特别理想,故而会形成短板效应,导致集群可用容量较少,成本升高
CurveFS架构设计
客户端curve-fuse,和元数据集群交互处理文件元数据增删改查请求,和数据集群交互处理文件数据的增删改查请求。
元数据集群metaserver cluster,用于接收和处理元数据(inode和dentry)的增删改查请求。metaserver cluster的架构和CurveBS类似,具有高可靠、高可用、高可扩的特点:
MDS用于管理集群拓扑结构,资源调度。
metaserver是数据节点,一个metaserver对应管理一个物理磁盘。CurveFS使用Raft保证元数据的可靠性和可用性,Raft复制组的基本单元是copyset。一个metaserver上包含多个copyset复制组。
数据集群data cluster,用于接收和处理文件数据的增删改查。data cluster目前支持两存储类型:支持S3接口的对象存储以及CurveBS(开发中)。
主要功能
POSIX兼容: 像本地文件系统一样使用,业务可以无缝接入
高可扩:元数据集群规模可以线性扩展
高速缓存:客户端有内存和磁盘两级缓存加速
支持数据存储到S3接口的对象存储和CurveBS(开发中)
libfuse,对接了其lowlevel fuse api,支持fuse用户态文件系统;
元数据cache,包含fsinfo, inode cache, dentry cache, 实现对元数据的缓存;
meta rpc client, 主要对接元数据集群,实现meta op的发送,超时重试等功能;
S3 client, 通过对接S3接口,将数据存储在s3中;
S3 data cache, 这是S3数据存储的缓存层,作为数据缓存,加速S3数据的读写性能;
curve client 通过对接Curve块存储SDK,实现将数据存储在Curve块存储集群中;
volume data cache,这是当数据存储在Curve块存储中的缓存层,以加速数据读写性能(开发中);
FsCacheManager:负责管理整个文件系统的缓存,包括inode到FileCacheManager的映射、读写cache大小统计和控制
FileCacheManager:负责管理单个文件的缓存
ChunkCacheManager:负责单个文件内某个chunk的缓存
DataCache:缓存管理的最小粒度,对应一个chunk内一段连续的数据空间。数据最终在DataCache这一层映射为S3存储的一个或多个对象,进行upoload
diskCache:负责本地磁盘缓存管理,数据持久化可以先写到本地磁盘上,再异步的写到S3存储上,能够有效的降低时延,提高吞吐
S3Client:负责调用后端的S3存储接口,目前使用的是AWS的SDK
通过topology子模块,管理的整个集群的topo信息,以及整个topo的生命周期管理
通过fs子模块,管理fs的super block信息;提供文件系统的创建,删除,挂卸载,查询等功能;负责fs的inode、dentry等元数据在metaserver的分布
通过heartbeat子模块,维持和metaserver的心跳,并收集metaserver的状态
通过调度系统进行调度。curvefs的元数据使用一致性协议保证可靠性,当出现某副本不可用的时候,调度器会自动的进行recover。调度功能正在开发中
在性能上:首先,MDS上元数据都会全部缓存在内存里,加速其查找。其次,在fs创建之后,MDS会为fs分配用来保存inode、dentry信息的分片,在系统中,一个分片被称为一个partition。完成partition分配之后,fs的元数据操作会由client直接发向metaserver。此后的fs的inode、dentry的元数据管理并不经过MDS
在可靠性和可用性上:MDS的元数据持久化到etcd中,依靠3副本的etcd保证元数据的可靠性。可以选择部署多个MDS服务,但是同时之后有一个MDS对外提供服务,当主MDS因为特殊原因挂掉之后,会在自动的在剩下的MDS中,通过选主算法选择一个新的主MDS继续提供服务
全新的部署工具 CurveAdm
CurveAdm内嵌一个 SQLite(嵌入式数据库,所有 DB 为一个文件),用于保存集群的topology与每个service相关信息,包括serviceId、containerId等
CurveAdm通过SSH登录目标机器,通过Docker CLI执行命令,对容器进行操控,容器所用镜像为Curve各个发行版,默认为latest最新版本
CurveAdm 支持跨平台运行,独立打包无其他依赖,可以一键安装,易用性较好
Curve组件运行在容器里,解决组件依赖问题和发行版适配问题
使用golang开发,开发迭代速度快,可定制化程度高
可自助收集集群日志并打包加密上传给Curve团队,便于分析解决问题
CurveAdm 本身支持一键自我更新,方便升级
待解决问题
暂不支持共享读写(开发中)
硬盘数据缓存空间管理策略、流控功能
随机读写性能问题:这是S3引擎的特点决定的,我们会进一步优化,比如采用并发分片上传、range读等
异常节点自动恢复功能(开发中)
回收站功能:误删数据可以找回并恢复
并发读写特性:后续会支持多节点共用文件系统同时读写
监控接入:使用prometheus收集监控信息,使用grafana进行展示
后续版本展望
CurveBS存储引擎支持
数据跨引擎生命周期管理
CSI插件
部署工具完善
基于k8s集群部署:目前已经支持helm部署方式,后续将继续优化,支持更高等级的云原生运维级别
多写多读
运维工具优化(监控告警、问题定位)
回收站
HDD场景适配优化
NFS、S3、HDFS等兼容性
快照
Curve是什么
Curve的定位
http://www.opencurve.io/docs/home/
https://github.com/opencurve/curve#design-documentation
https://github.com/opencurve/curve-meetup-slides
https://zhuanlan.zhihu.com/p/311590077
PolarFS适配:已完成单pfsd+单CurveBS卷的对接,后续会支持多pfsd+单CurveBS卷特性,代码库:https://github.com/skypexu/polardb-file-system/tree/curvebs_sdk_devio
ARM64平台适配:已完成基本功能测试,后续会进行性能优化和稳定性验证,代码库:https://github.com/opencurve/curve/tree/arm64
FIO CurveBS engine:已支持,代码库:https://github.com/skypexu/fio/tree/nebd_engine
NVME/RDMA适配:近期会进行适配验证以及性能优化
iSCSI接口支持:使用范围比较广泛,普适性较高,计划近期支持
Raft优化:尝试优化Raft的日志管理、提升I/O并发度、支持follower读、Raft降级(3副本只有1副本存活仍然可对外服务)等